#include "mystring.h"
#include <cstdlib>
#include <cstring>

#define INIT_MALLOC_LEN  16

mystring::mystring()
{
	p_str = (char *)malloc(INIT_MALLOC_LEN);
	if (p_str != NULL)
		memset(p_str, 0, INIT_MALLOC_LEN);
}

mystring::mystring(const char *p_str)
{
	if (p_str != NULL)
	{
		int len = strlen(p_str);
		this->p_str = (char *)malloc(len + 1);
		memcpy(this->p_str, p_str, len);
		this->p_str[len] = '\0';
	}

	std::cout << this->p_str << " 123" << std::endl;
}

mystring::mystring(const mystring &str)
{
	if (str.p_str != NULL)
	{
		int len = strlen(str.p_str);
		this->p_str = (char *)malloc(len + 1);
		memcpy(this->p_str, str.p_str, len);
		this->p_str[len] = '\0';
	}
}

mystring::~mystring()
{
	if (p_str != NULL)
	{
		free(p_str);
		std::cout << "destructor" << std::endl;
	}
}

mystring mystring::operator+(const mystring &str)
{
	mystring tmp;
	int len = strlen(this->p_str) + strlen(str.p_str);
	tmp.p_str = (char *)realloc(tmp.p_str, len + 1);
	strcat(tmp.p_str, this->p_str);
	strcat(tmp.p_str, str.p_str);
	return tmp;
}

mystring & mystring::operator=(const mystring &str)
{
	if (str.p_str != NULL)
	{
		int len = strlen(str.p_str);
		this->p_str = (char *)realloc(this->p_str, len + 1);
		memcpy(this->p_str, str.p_str, len);
		this->p_str[len] = '\0';
	}

	return *this;
}

std::ostream & operator<<(std::ostream &cout, const mystring &str)
{
	return cout << str.p_str;
}
